import json
import subprocess
import os
import sys, codecs
import shutil
import datetime
from datetime import date

today = date.today()
today_string = today.strftime("%m_%d_%y")
#{убираем спецификацию (которую добавляет 1С при записи) из файла с параметрами
BUFSIZE = 4096
BOMLEN = len(codecs.BOM_UTF8)

with open('C:\\Users\\Путь к репозиторию с проектом\\paramsbuild.json', "r+b") as fp:
    chunk = fp.read(BUFSIZE)
    if chunk.startswith(codecs.BOM_UTF8):
        i=0
        chunk = chunk[BOMLEN:]
        while chunk:
            fp.seek(i)
            fp.write(chunk)
            i += len(chunk)
            fp.seek(BOMLEN, os.SEEK_CUR)
            chunk = fp.read(BUFSIZE)
        fp.seek(-BOMLEN, os.SEEK_CUR)
        fp.truncate()
#убираем спецификацию (которую добавляет 1С при записи) из файла с параметрами}

#{убираем спецификацию (которую добавляет 1С при записи) из файла с версией сборки
BUFSIZE = 4096
BOMLEN = len(codecs.BOM_UTF8)

with open('C:\\Users\\Путь к репозиторию с проектом\\BUILD_VERSION.txt', "r+b") as fp:
    chunk = fp.read(BUFSIZE)
    if chunk.startswith(codecs.BOM_UTF8):
        i=0
        chunk = chunk[BOMLEN:]
        while chunk:
            fp.seek(i)
            fp.write(chunk)
            i += len(chunk)
            fp.seek(BOMLEN, os.SEEK_CUR)
            chunk = fp.read(BUFSIZE)
        fp.seek(-BOMLEN, os.SEEK_CUR)
        fp.truncate()
#убираем спецификацию (которую добавляет 1С при записи) из файла с версией сборки}

#копируем файл с версией в каталог репозитория этапа CDP (при использовании одного репозитория на всех этапах данная строчка кода не нужна)
shutil.copyfile('C:\\Users\\Путь к репозиторию с проектом\\BUILD_VERSION.txt', 'C:\\Users\\Путь к репозиторию с проектом\\paramsbuild.json')

json_f = open('C:\\Users\\Путь к репозиторию с проектом\\paramsbuild.json') # открываем файл с параметрами

dataparam = json.load(json_f) # читаем параметры из файла

for p in dataparam['params']:

    base = p['base']
    version_platform = p['version_platform']
    distribution_path = p['distribution_path']
    project_path = p['project_path']
    storage1C = p['storage1C']
    User = p['User']
    Password = p['Password']
    DescriptionBuild = p['DescriptionBuild']

#работа с логами
flog = open('C:\\Users\\Путь к репозиторию с проектом\\logs\\log'+today_string+'.txt', 'w',encoding='utf-8')
flog.write('Шаг 1: выгрузка файла конфигурации в папку проекта'+'\n')

#подключаемся к базе разработки и сохраняем конфигурацию в папку проекта
code = subprocess.call(rf'C:\\"Program Files"\1cv8\{version_platform}\bin\1cv8.exe Config /S{base} /n{User} /p{Password} /ConfigurationRepositoryF {storage1C}\ /ConfigurationRepositoryN {User} /ConfigurationRepositoryP {Password} /DisableStartupMessage //ConfigurationRepositoryDumpCfg {distribution_path} -Format Hierarchical', shell=True)
if code==0:
    flog.write('Шаг 1: Файл конфигурации успешно выгружен в папку проекта'+'\n')
    os.chdir(project_path)
    tecdir = os.getcwd()
    flog.write(f'Шаг 2: Перешли в папку проекта {project_path}'+'\n')
    print(f'Шаг 2: Перешли в папку проекта {project_path}')
    #запускаем процесс обновления проекта в репозитории
    codegit = subprocess.call(r'git add .')

    if codegit==0:
        flog.write('git add успешно завершено'+'\n')
        print('Шаг 3: git add успешно завершено')

        codecgm = subprocess.call(rf'git commit -m "{DescriptionBuild}"')
        if codecgm==0:
            flog.write('Шаг 4: git commit успешно завершено'+'\n')
            print('Шаг 4: git commit успешно завершено')
        
            codepsh = subprocess.call(rf'git push')
            if codepsh==0:
                flog.write('Шаг 5: git push успешно завершено'+'\n')
                print('Шаг 5: git push успешно завершено')
            
                codechk = subprocess.call(r'git checkout master')

                if codechk==0:
                    flog.write('Шаг 6: git checkout master успешно завершено'+'\n')
                    print('Шаг 6: git checkout master успешно завершено')
                
                    codemrg = subprocess.call(rf'git merge develop')
                    if codemrg==0:
                        flog.write('Шаг 7: git merge develop успешно завершено'+'\n')
                        print('Шаг 7: git merge develop успешно завершено')

                        codepshM = subprocess.call(r'git push')
                        if codepshM==0:
                            flog.write('Шаг 8: git push успешно завершено'+'\n')
                            print('Шаг 8: git push успешно завершено')

                            codechkD = subprocess.call(r'git checkout develop')    

                            if codechkD==   0:
                                flog.write('Шаг 9: git checkout develop успешно завершено'+'\n')
                                print('Шаг 9: git checkout develop успешно завершено')
                            else:
                                flog.write('Шаг 9: git checkout develop не завершен'+'\n')
                                print('Шаг 9: git checkout develop не завершен')
                                                                                                                    
                                                                                                                
                        else:  
                           flog.write('Шаг 8: git push в ветку master не завершено'+'\n')
                           print('Шаг 8: git push в ветку master не завершено')                                                                                               
                    else:
                        flog.write('Шаг 7: git merge develop не завершен'+'\n')
                        print('Шаг 7: git merge develop не завершен')                                                           

                else:
                    flog.write('Шаг 6: git checkout master не завершен'+'\n')
                    print('Шаг 6: git checkout master не завершен')
                                                                
            else:
                flog.write('Шаг 5: git push не завершен'+'\n')
                print('Шаг 5: git push не завершен')
                                                                                                                                                             
        else:
            flog.write('git commit не завершен'+'\n')
            print('Шаг 4: git commit не завершен')
                                                                                                        
    else:
        flog.write('Шаг 3: Не удалось добавить изменения в git'+'\n')
        print('Шаг 3: Не удалось добавить изменения в git')

else:
    flog.write('Шаг 1: Не удалось выгрузить файл конфигурации в папку проекта'+'\n')
    print('Шаг 1: Не удалось выгрузить файл конфигурации в папку проекта')

  flog.close()
  json_f.close()
